package base_init

import (
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
	"go.uber.org/zap"
)

// GetEnvInfo：获取环境变量值, env表示环境变量配置的参数, 值时候
func GetEnvInfo(env string) bool {
	viper.AutomaticEnv()
	return viper.GetBool(env)
}

func YmlConfig(filePath string, rawVal any) {
	// 创建一个新的 viper 实例，viper 用于读取配置文件
	v := viper.New()

	// 设置配置文件路径，这里指定了一个 YAML 配置文件
	v.SetConfigFile(filePath)

	// 读取配置文件，如果读取失败则会 panic（抛出异常）
	if err := v.ReadInConfig(); err != nil {
		//zap.S().Fatalf()（会直接 os.Exit(1)，直接退出, 适合初始化）
		zap.S().Fatalf("读取配置文件错误: %v", err)
	}

	// 创建一个 ServerConfig 类型的实例，用于存储从配置文件中读取的数据
	// 将配置文件中的数据解析到 serverConfig 结构体中
	if err := v.Unmarshal(rawVal); err != nil {
		//zap.S().Fatalf()（会直接 os.Exit(1)，直接退出, 适合初始化）
		zap.S().Fatalf("解析配置文件错误: %v", err)
	}

	//serverConfig := base_global.ServerConfig
	// 打印解析后的 serverConfig 结构体内容
	zap.S().Infow("初始化yml配置信息成功")

	// 监控配置文件的变化，并在变化时重新加载配置
	watchConfig(v, rawVal)
}

func watchConfig(v *viper.Viper, rawVal any) {
	// 监控配置文件的变化，并在变化时重新加载配置
	v.WatchConfig()

	// 配置文件变化时触发的回调函数
	v.OnConfigChange(func(e fsnotify.Event) {
		// 打印配置文件变化的信息，e.Name 是发生变化的配置文件路径
		zap.S().Infof("配置文件产生变化：%s", e.Name)

		// 重新读取配置文件内容
		if err := v.ReadInConfig(); err != nil {
			//zap.S().Fatalf()（会直接 os.Exit(1)，直接退出, 适合初始化）
			zap.S().Fatalf("监听读取解析配置文件错误: %v", err)
		}

		// 将读取到的配置文件内容反序列化到 serverConfig 结构体中
		if err := v.Unmarshal(rawVal); err != nil {
			//zap.S().Fatalf()（会直接 os.Exit(1)，直接退出, 适合初始化）
			zap.S().Fatalf("监听读取配置文件内容序列化对象中错误: %v", err)
		}

		zap.S().Infow("监听配置文件变化", "变化后的配置信息", rawVal)
	})

}
